<?php
// +----------------------------------------------------------------------
// | Name 风音框架
// +----------------------------------------------------------------------
// | Author 唐启云 <tqy@fxri.net>
// +----------------------------------------------------------------------
// | Copyright Copyright © 2016-2099 方弦研究所. All rights reserved.
// +----------------------------------------------------------------------
// | Link https://www.fxri.net
// +----------------------------------------------------------------------

namespace fxsafe\facade;

/**
 * 参数类
 */
class Param
{
    /**
     * 定义参数
     * @param array $param 参数
     * @param int $mode 模式
     * @return array
     */
    public function define($param, $mode = null)
    {
        // 初始化变量
        $echo = [];
        switch ($mode) {
            case '1.1.1':
                // 数组覆盖-融合-值不存在
                // $predefined = [
                //     'data' => null,
                // ];
                // data => mixed
                $echo = $param[0];
                foreach ($param[1] as $key => $value) {
                    if (!isset($echo[$key])) {
                        $echo[$key] = $value;
                    }
                }
                break;
            case '1.1.2':
                // 数组覆盖-融合-值不存在或为空字符串
                // $predefined = [
                //     'data' => null,
                // ];
                // data => mixed
                $echo = $param[0];
                foreach ($param[1] as $key => $value) {
                    if (!isset($echo[$key]) || '' === $echo[$key]) {
                        $echo[$key] = $value;
                    }
                }
                break;
        }
        return $echo;
    }

    /**
     * 合并数组
     * @param array|int $limit 次数限制或数组第1条
     * @param boolean|string $cover 覆盖或数组第2条
     * @param boolean $type 类型或数组第3条
     * @param array $args 数组集合
     * @return mixed
     */
    public function merge($limit = -1, $cover = true, $type = false)
    {
        // 初始化变量
        $echo = [];
        $args = func_get_args();
        array_splice($args, 0, 3);
        // 疏理类型
        if (!is_bool($type)) {
            array_unshift($args, $type);
            $type = false;
        }
        // 疏理覆盖
        if (!is_bool($cover) && !is_string($cover)) {
            array_unshift($args, $cover);
            $cover = true;
        }
        // 疏理限制
        if (!is_int($limit)) {
            array_unshift($args, $limit);
            $limit = -1;
        }
        if (count($args) < 2) {
            return array_shift($args);
        } else if (count($args) > 2) {
            $echo[0] = array_shift($args);
            $echo[1] = call_user_func_array([$this, 'merge'], array_merge([$limit, $cover, $type], $args));
        } else {
            $echo = $args;
        }
        return $this->cover($echo, $limit, $cover, $type);
    }

    /**
     * 覆盖数组
     * @param array $args 数组集合
     * @param int $limit 次数限制
     * @param boolean|string $cover 覆盖
     * @param boolean $type 类型
     * @return array
     */
    public function cover($args, $limit = -1, $cover = true, $type = false)
    {
        // 初始化变量
        if (!is_array($args[0]) || $limit === 0) {
            $args[0] = $args[1];
        } else if (is_array($args[1])) {
            if ($limit > 0) {
                $limit--;
            }
            // 数组融合，已存在配置参数则覆盖
            foreach ($args[1] as $key => $value) {
                if (!isset($args[0][$key])) {
                    $args[0][$key] = $value;
                } else if (is_array($value)) {
                    $args[0][$key] = $this->cover([$args[0][$key], $value], $limit, $cover, $type);
                } else if ($cover === true) {
                    $args[0][$key] = $value;
                } else if ($cover == 'blank' && is_blank($args[0][$key])) {
                    $args[0][$key] = $value;
                }
                // 转换类型
                if (!$type) continue;
                // 识别字段类型
                switch (gettype($value)) {
                    case 'integer':
                        // 整型
                        $args[0][$key] = (int)$args[0][$key];
                        break;
                    case 'double':
                        // 浮点型
                        $args[0][$key] = (float)$args[0][$key];
                        break;
                }
            }
        }
        return $args[0];
    }

    /**
     * 解析Json
     * @param mixed $var 变量
     * @param string $type 类型
     * @param mixed $param 参数
     * @return mixed
     */
    public function json($var, $type, $param = null)
    {
        // 初始化变量
        $echo = null;
        $type = strtolower($type);
        switch ($type) {
            case 'encode':
                // 编码
                if (is_null($param)) {
                    $param = JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES;
                }
                $echo = json_encode($var, $param);
                break;
            case 'decode':
                // 解码
                if (is_null($param)) {
                    $param = true;
                }
                $echo = json_decode($var, $param);
                break;
        }
        return $echo;
    }
}
